import { EventEmitter } from '../utils/EventEmitter';
import { Vector2 } from './Vector2';

/**
 * 碰撞体类型
 */
export enum ColliderType {
    /** 矩形碰撞体 */
    RECTANGLE = 'rectangle',
    /** 圆形碰撞体 */
    CIRCLE = 'circle',
    /** 多边形碰撞体 */
    POLYGON = 'polygon'
}

/**
 * 碰撞体状态
 */
export enum ColliderState {
    /** 激活状态 */
    ACTIVE = 'active',
    /** 休眠状态 */
    SLEEPING = 'sleeping',
    /** 禁用状态 */
    DISABLED = 'disabled'
}

/**
 * 碰撞事件类型
 */
export enum CollisionEventType {
    /** 碰撞开始 */
    COLLISION_START = 'collisionStart',
    /** 碰撞持续 */
    COLLISION_STAY = 'collisionStay',
    /** 碰撞结束 */
    COLLISION_END = 'collisionEnd',
    /** 触发器进入 */
    TRIGGER_ENTER = 'triggerEnter',
    /** 触发器停留 */
    TRIGGER_STAY = 'triggerStay',
    /** 触发器退出 */
    TRIGGER_EXIT = 'triggerExit',
    /** 触发器开始 */
    TRIGGER_START = 'triggerStart',
    /** 触发器结束 */
    TRIGGER_END = 'triggerEnd'
}

/**
 * 碰撞体选项
 */
export interface ColliderOptions {
    /** 碰撞体类型 */
    type: ColliderType;
    /** 碰撞体位置 */
    position?: Vector2;
    /** 是否作为触发器 */
    isTrigger?: boolean;
    /** 碰撞体标签 */
    tag?: string;
    /** 碰撞体层级 */
    layer?: number;
    /** 碰撞体偏移 */
    offset?: Vector2;
    /** 碰撞体旋转（弧度） */
    rotation?: number;
    /** 碰撞体缩放 */
    scale?: Vector2;
    /** 是否启用碰撞响应 */
    enabled?: boolean;
}

/**
 * 矩形碰撞体选项
 */
export interface RectangleColliderOptions extends ColliderOptions {
    /** 碰撞体类型 */
    type: ColliderType.RECTANGLE;
    /** 宽度 */
    width: number;
    /** 高度 */
    height: number;
}

/**
 * 圆形碰撞体选项
 */
export interface CircleColliderOptions extends ColliderOptions {
    /** 碰撞体类型 */
    type: ColliderType.CIRCLE;
    /** 半径 */
    radius: number;
}

/**
 * 多边形碰撞体选项
 */
export interface PolygonColliderOptions extends ColliderOptions {
    /** 碰撞体类型 */
    type: ColliderType.POLYGON;
    /** 顶点数组 */
    vertices: Vector2[];
}

/**
 * 碰撞体接口
 */
export interface Collider extends EventEmitter {
    /** 碰撞体ID */
    readonly id: string;
    /** 碰撞体类型 */
    readonly type: ColliderType;
    /** 碰撞体状态 */
    readonly state: ColliderState;
    /** 是否作为触发器 */
    readonly isTrigger: boolean;
    /** 碰撞体标签 */
    readonly tag: string;
    /** 碰撞体层级 */
    readonly layer: number;
    /** 碰撞体偏移 */
    readonly offset: Vector2;
    /** 碰撞体旋转（弧度） */
    readonly rotation: number;
    /** 碰撞体缩放 */
    readonly scale: Vector2;
    /** 是否启用碰撞响应 */
    readonly enabled: boolean;
    /** 碰撞体位置 */
    position: Vector2;
    /** 碰撞体边界 */
    readonly bounds: {
        min: Vector2;
        max: Vector2;
    };
    
    /** 更新碰撞体 */
    update(position: Vector2, rotation?: number, scale?: Vector2): void;
    /** 检查是否与另一个碰撞体相交 */
    intersects(other: Collider): boolean;
    /** 检查点是否在碰撞体内 */
    contains(point: Vector2): boolean;
    /** 获取碰撞体中心点 */
    getCenter(): Vector2;
    /** 获取碰撞体面积 */
    getArea(): number;
    /** 克隆碰撞体 */
    clone(): Collider;
    /** 销毁碰撞体 */
    destroy(): void;
    /** 检查碰撞体是否有效 */
    isValid(): boolean;
    /** 计算两个碰撞体之间的碰撞结果 */
    calculateCollision(other: Collider): CollisionResult;
    /** 将世界坐标转换为局部坐标 */
    worldToLocal(point: Vector2): Vector2;
    /** 将局部坐标转换为世界坐标 */
    localToWorld(point: Vector2): Vector2;
}

/**
 * 碰撞事件数据
 */
export interface CollisionEventData {
    /** 碰撞体A */
    colliderA: Collider;
    /** 碰撞体B */
    colliderB: Collider;
    /** 碰撞点 */
    contactPoint?: Vector2;
    /** 碰撞法线 */
    normal?: Vector2;
    /** 穿透深度 */
    penetration?: number;
    /** 碰撞事件类型 */
    type: CollisionEventType;
    /** 碰撞结果 */
    result: CollisionResult;
}

/**
 * 碰撞管理器选项
 */
export interface CollisionManagerOptions {
    /** 是否启用碰撞检测 */
    enabled: boolean;
    /** 是否使用空间分区 */
    useSpatialPartitioning: boolean;
    /** 空间分区网格大小 */
    gridSize: number;
    /** 最大碰撞检测次数 */
    maxCollisionChecks: number;
    /** 是否启用碰撞事件 */
    enableEvents: boolean;
    /** 是否启用触发器 */
    enableTriggers: boolean;
    /** 是否启用碰撞调试 */
    enableDebug: boolean;
}

/**
 * 碰撞检测结果
 */
export interface CollisionResult {
    /** 是否发生碰撞 */
    collided: boolean;
    /** 碰撞点 */
    contactPoint?: Vector2;
    /** 碰撞法线 */
    normal?: Vector2;
    /** 穿透深度 */
    penetration?: number;
}

/**
 * 空间分区单元格
 */
export interface SpatialCell {
    /** 单元格边界 */
    bounds: {
        min: Vector2;
        max: Vector2;
    };
    /** 单元格中的碰撞体 */
    colliders: Set<Collider>;
}

/**
 * 空间分区网格
 */
export interface SpatialGrid {
    /** 网格边界 */
    bounds: {
        min: Vector2;
        max: Vector2;
    };
    /** 单元格大小 */
    cellSize: number;
    /** 单元格数组 */
    cells: Map<string, SpatialCell>;
    
    /** 获取点所在的单元格 */
    getCellAt(point: Vector2): SpatialCell | undefined;
    /** 获取区域内的所有单元格 */
    getCellsInArea(bounds: { min: Vector2; max: Vector2 }): SpatialCell[];
    /** 添加碰撞体到网格 */
    addCollider(collider: Collider): void;
    /** 从网格中移除碰撞体 */
    removeCollider(collider: Collider): void;
    /** 更新碰撞体在网格中的位置 */
    updateCollider(collider: Collider): void;
    /** 清空网格 */
    clear(): void;
}

/**
 * 碰撞事件处理器
 */
export type CollisionEventHandler = (event: CollisionEventData) => void; 